import asyncio
from pathlib import Path
import shutil
from crawlee.crawlers import PlaywrightCrawler, PlaywrightCrawlingContext
from note_info_get import get_element_1, get_last_update_time, get_three_data, get_ip_location, get_note_author_info

async def main():
        
    # 创建爬虫实例，直接配置浏览器选项
    crawler = PlaywrightCrawler(
        # 浏览器类型
        browser_type='chromium',
        # 是否显示浏览器窗口
        headless=False,
        # 最大请求数
        max_requests_per_crawl=5,
        # 关键设置：用户数据目录，用于保存登录状态
        user_data_dir="./user_data/xiaohongshu"
    )
    
    @crawler.router.default_handler
    async def handle_request(context: PlaywrightCrawlingContext):
        context.log.info(f"正在处理: {context.request.url}")
        
        # 等待页面加载

        #await context.page.wait_for_load_state('networkidle')
        
        context.log.info("等待3秒")
        await context.page.wait_for_timeout(3000)
        context.log.info("等待3秒结束")

        # 检查登录状态
        try:
            # 检查是否出现登录弹窗
            login_popup_count = await context.page.locator('.login-reason').count()
            print(login_popup_count)
            if login_popup_count > 0:
                context.log.info("检测到登录弹窗，需要登录")
                context.log.info("====================================")
                context.log.info("请在浏览器窗口中完成扫码登录操作...")
                context.log.info("登录后会自动继续")
                context.log.info("====================================")
                
                # 等待登录弹窗消失，说明登录成功
                await context.page.wait_for_selector('.login-reason', 
                                                   state='hidden',
                                                   timeout=120000)
                context.log.info("✅ 登录成功!")
            
        except Exception as e:
            context.log.error(f"检查登录状态时出错: {str(e)}")
        
        # 笔记url
        note_url = context.request.url
        context.log.info(f"笔记url: {note_url}")

        # 获取网页源码
        html_content = await context.page.content()

        # 笔记标题
        note_title = get_element_1(html_content, 'og:title')
        context.log.info(f"笔记标题: {note_title}")

        # 笔记内容
        note_content = get_element_1(html_content, 'description')
        context.log.info(f"笔记内容: {note_content}")

        # 笔记日期
        note_date = get_last_update_time(html_content)
        context.log.info(f"笔记日期: {note_date}")

        # 笔记点赞，评论，收藏
        note_data = get_three_data(html_content)
        context.log.info(f"笔记点赞: {note_data[0]}, 笔记评论: {note_data[1]}, 笔记收藏: {note_data[2]}")

        # 关联话题
        note_topic = get_element_1(html_content, 'keywords')
        context.log.info(f"关联话题: {note_topic}")

        # 发布地点
        note_ip = get_ip_location(html_content)
        context.log.info(f"发布地点: {note_ip}")

        # 内容类型
        note_type = get_element_1(html_content, 'og:type')
        context.log.info(f"内容类型: {note_type}")

        # 作者名字, 作者url
        blogger_info = get_note_author_info(html_content)
        context.log.info(f"作者名字: {blogger_info[0]}, 作者url: {blogger_info[1]}")

        # 保存数据
        await context.push_data({
            'note_url': note_url,
            'note_title': note_title,
            'note_content': note_content,
            'note_date': note_date,
            'note_like_num': note_data[0],
            'note_comment_num': note_data[1],
            'note_collect_num': note_data[2],
            'note_share_num': note_data[3],
            'note_topic': note_topic,
            'note_ip': note_ip,
            'note_type': note_type,
            'blogger_name': blogger_info[0],
            'blogger_url': blogger_info[1]
        })
        

    # 启动爬虫，从小红书首页开始
    await crawler.run(["https://www.xiaohongshu.com/explore/680b2cdd000000001b03c72c?xsec_token=ABNCOpb3r5rsV_Ai8T20JvFAYhkzAtaGIX5432JfegQh0=&xsec_source=pc_user"])

if __name__ == "__main__":
    asyncio.run(main())